using System.ComponentModel;

namespace Bogus;

/// <summary>
/// Static class for holding character string constants.
/// </summary>
public static class Chars
{
   /// <summary>
   /// Lower case, a-z.
   /// </summary>
   public const string LowerCase = "abcdefghijklmnopqrstuvwxyz";

   /// <summary>
   /// Upper case, A-Z.
   /// </summary>
   public const string UpperCase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

   /// <summary>
   /// Numbers, 0-9.
   /// </summary>
   public const string Numbers = "0123456789";

   /// <summary>
   /// Hexadecimal, 0-9 and a-f.
   /// </summary>
   public const string HexLowerCase = Numbers + "abcdef";

   /// <summary>
   /// Hexadecimal, 0-9 and A-F.
   /// </summary>
   public const string HexUpperCase = Numbers + "ABCDEF";


   /// <summary>
   /// Alphanumeric upper case 0-9 and A-Z.
   /// </summary>
   public const string AlphaNumericUpperCase = Numbers + UpperCase;
   
   /// <summary>
   /// Alphanumeric lower case 0-9 and a-z.
   /// </summary>
   public const string AlphaNumericLowerCase = Numbers + LowerCase;
}

/// <summary>
/// Contains information about contiguous blocks of unicode character ranges.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public static class SafeUnicodeRanges
{
   /// <summary>
   /// Contiguous blocks of unicode scalars that are not surrogates and where
   /// char.IsLetterOrDigit is true.
   /// </summary>
   public static string[] Basic = {
         "\u0030-\u0039",
         "\u0041-\u005A",
         "\u0061-\u007A",
         "\u00C0-\u00D6",
         "\u00D8-\u00F6",
         "\u00F8-\u02C1",
         "\u02C6-\u02D1",
         "\u02E0-\u02E4",
         "\u037A-\u037D",
         "\u0388-\u038A",
         "\u038E-\u03A1",
         "\u03A3-\u03CE",
         "\u03D0-\u03F5",
         "\u03F7-\u0481",
         "\u048A-\u0513",
         "\u0531-\u0556",
         "\u0561-\u0587",
         "\u05D0-\u05EA",
         "\u05F0-\u05F2",
         "\u0621-\u063A",
         "\u0640-\u064A",
         "\u0660-\u0669",
         "\u066E-\u066F",
         "\u0671-\u06D3",
         "\u06E5-\u06E6",
         "\u06EE-\u06FC",
         "\u0712-\u072F",
         "\u074D-\u076D",
         "\u0780-\u07A5",
         "\u07C0-\u07EA",
         "\u07F4-\u07F5",
         "\u0904-\u0939",
         "\u0958-\u0961",
         "\u0966-\u096F",
         "\u097B-\u097F",
         "\u0985-\u098C",
         "\u098F-\u0990",
         "\u0993-\u09A8",
         "\u09AA-\u09B0",
         "\u09B6-\u09B9",
         "\u09DC-\u09DD",
         "\u09DF-\u09E1",
         "\u09E6-\u09F1",
         "\u0A05-\u0A0A",
         "\u0A0F-\u0A10",
         "\u0A13-\u0A28",
         "\u0A2A-\u0A30",
         "\u0A32-\u0A33",
         "\u0A35-\u0A36",
         "\u0A38-\u0A39",
         "\u0A59-\u0A5C",
         "\u0A66-\u0A6F",
         "\u0A72-\u0A74",
         "\u0A85-\u0A8D",
         "\u0A8F-\u0A91",
         "\u0A93-\u0AA8",
         "\u0AAA-\u0AB0",
         "\u0AB2-\u0AB3",
         "\u0AB5-\u0AB9",
         "\u0AE0-\u0AE1",
         "\u0AE6-\u0AEF",
         "\u0B05-\u0B0C",
         "\u0B0F-\u0B10",
         "\u0B13-\u0B28",
         "\u0B2A-\u0B30",
         "\u0B32-\u0B33",
         "\u0B35-\u0B39",
         "\u0B5C-\u0B5D",
         "\u0B5F-\u0B61",
         "\u0B66-\u0B6F",
         "\u0B85-\u0B8A",
         "\u0B8E-\u0B90",
         "\u0B92-\u0B95",
         "\u0B99-\u0B9A",
         "\u0B9E-\u0B9F",
         "\u0BA3-\u0BA4",
         "\u0BA8-\u0BAA",
         "\u0BAE-\u0BB9",
         "\u0BE6-\u0BEF",
         "\u0C05-\u0C0C",
         "\u0C0E-\u0C10",
         "\u0C12-\u0C28",
         "\u0C2A-\u0C33",
         "\u0C35-\u0C39",
         "\u0C60-\u0C61",
         "\u0C66-\u0C6F",
         "\u0C85-\u0C8C",
         "\u0C8E-\u0C90",
         "\u0C92-\u0CA8",
         "\u0CAA-\u0CB3",
         "\u0CB5-\u0CB9",
         "\u0CE0-\u0CE1",
         "\u0CE6-\u0CEF",
         "\u0CF1-\u0CF2",
         "\u0D05-\u0D0C",
         "\u0D0E-\u0D10",
         "\u0D12-\u0D28",
         "\u0D2A-\u0D39",
         "\u0D60-\u0D61",
         "\u0D66-\u0D6F",
         "\u0D85-\u0D96",
         "\u0D9A-\u0DB1",
         "\u0DB3-\u0DBB",
         "\u0DC0-\u0DC6",
         "\u0E01-\u0E30",
         "\u0E32-\u0E33",
         "\u0E40-\u0E46",
         "\u0E50-\u0E59",
         "\u0E81-\u0E82",
         "\u0E87-\u0E88",
         "\u0E94-\u0E97",
         "\u0E99-\u0E9F",
         "\u0EA1-\u0EA3",
         "\u0EAA-\u0EAB",
         "\u0EAD-\u0EB0",
         "\u0EB2-\u0EB3",
         "\u0EC0-\u0EC4",
         "\u0ED0-\u0ED9",
         "\u0EDC-\u0EDD",
         "\u0F20-\u0F29",
         "\u0F40-\u0F47",
         "\u0F49-\u0F6A",
         "\u0F88-\u0F8B",
         "\u1000-\u1021",
         "\u1023-\u1027",
         "\u1029-\u102A",
         "\u1040-\u1049",
         "\u1050-\u1055",
         "\u10A0-\u10C5",
         "\u10D0-\u10FA",
         "\u1100-\u1159",
         "\u115F-\u11A2",
         "\u11A8-\u11F9",
         "\u1200-\u1248",
         "\u124A-\u124D",
         "\u1250-\u1256",
         "\u125A-\u125D",
         "\u1260-\u1288",
         "\u128A-\u128D",
         "\u1290-\u12B0",
         "\u12B2-\u12B5",
         "\u12B8-\u12BE",
         "\u12C2-\u12C5",
         "\u12C8-\u12D6",
         "\u12D8-\u1310",
         "\u1312-\u1315",
         "\u1318-\u135A",
         "\u1380-\u138F",
         "\u13A0-\u13F4",
         "\u1401-\u166C",
         "\u166F-\u1676",
         "\u1681-\u169A",
         "\u16A0-\u16EA",
         "\u1700-\u170C",
         "\u170E-\u1711",
         "\u1720-\u1731",
         "\u1740-\u1751",
         "\u1760-\u176C",
         "\u176E-\u1770",
         "\u1780-\u17B3",
         "\u17E0-\u17E9",
         "\u1810-\u1819",
         "\u1820-\u1877",
         "\u1880-\u18A8",
         "\u1900-\u191C",
         "\u1946-\u196D",
         "\u1970-\u1974",
         "\u1980-\u19A9",
         "\u19B0-\u19C9",
         "\u19D0-\u19D9",
         "\u1A00-\u1A16",
         "\u1B05-\u1B33",
         "\u1B45-\u1B4B",
         "\u1B50-\u1B59",
         "\u1D00-\u1DBF",
         "\u1E00-\u1E9B",
         "\u1EA0-\u1EF9",
         "\u1F00-\u1F15",
         "\u1F18-\u1F1D",
         "\u1F20-\u1F45",
         "\u1F48-\u1F4D",
         "\u1F50-\u1F57",
         "\u1F5F-\u1F7D",
         "\u1F80-\u1FB4",
         "\u1FB6-\u1FBC",
         "\u1FC2-\u1FC4",
         "\u1FC6-\u1FCC",
         "\u1FD0-\u1FD3",
         "\u1FD6-\u1FDB",
         "\u1FE0-\u1FEC",
         "\u1FF2-\u1FF4",
         "\u1FF6-\u1FFC",
         "\u2090-\u2094",
         "\u210A-\u2113",
         "\u2119-\u211D",
         "\u212A-\u212D",
         "\u212F-\u2139",
         "\u213C-\u213F",
         "\u2145-\u2149",
         "\u2183-\u2184",
         "\u2C00-\u2C2E",
         "\u2C30-\u2C5E",
         "\u2C60-\u2C6C",
         "\u2C74-\u2C77",
         "\u2C80-\u2CE4",
         "\u2D00-\u2D25",
         "\u2D30-\u2D65",
         "\u2D80-\u2D96",
         "\u2DA0-\u2DA6",
         "\u2DA8-\u2DAE",
         "\u2DB0-\u2DB6",
         "\u2DB8-\u2DBE",
         "\u2DC0-\u2DC6",
         "\u2DC8-\u2DCE",
         "\u2DD0-\u2DD6",
         "\u2DD8-\u2DDE",
         "\u3005-\u3006",
         "\u3031-\u3035",
         "\u303B-\u303C",
         "\u3041-\u3096",
         "\u309D-\u309F",
         "\u30A1-\u30FA",
         "\u30FC-\u30FF",
         "\u3105-\u312C",
         "\u3131-\u318E",
         "\u31A0-\u31B7",
         "\u31F0-\u31FF",
         "\u3400-\u4DB5",
         "\u4E00-\u9FBB",
         "\uA000-\uA48C",
         "\uA717-\uA71A",
         "\uA800-\uA801",
         "\uA803-\uA805",
         "\uA807-\uA80A",
         "\uA80C-\uA822",
         "\uA840-\uA873",
         "\uAC00-\uD7A3",
         "\uF900-\uFA2D",
         "\uFA30-\uFA6A",
         "\uFA70-\uFAD9",
         "\uFB00-\uFB06",
         "\uFB13-\uFB17",
         "\uFB1F-\uFB28",
         "\uFB2A-\uFB36",
         "\uFB38-\uFB3C",
         "\uFB40-\uFB41",
         "\uFB43-\uFB44",
         "\uFB46-\uFBB1",
         "\uFBD3-\uFD3D",
         "\uFD50-\uFD8F",
         "\uFD92-\uFDC7",
         "\uFDF0-\uFDFB",
         "\uFE70-\uFE74",
         "\uFE76-\uFEFC",
         "\uFF10-\uFF19",
         "\uFF21-\uFF3A",
         "\uFF41-\uFF5A",
         "\uFF66-\uFFBE",
         "\uFFC2-\uFFC7",
         "\uFFCA-\uFFCF",
         "\uFFD2-\uFFD7",
         "\uFFDA-\uFFDC",
      };

   /// <summary>
   /// Contiguous blocks of unicode surrogate pairs and where
   /// char.IsLetterOrDigit is true.
   /// </summary>
   public static string[] SurrogatePairs =
      {
         "\uD800\uDC00-\uD800\uDC0B",
         "\uD800\uDC0D-\uD800\uDC26",
         "\uD800\uDC28-\uD800\uDC3A",
         "\uD800\uDC3C-\uD800\uDC3D",
         "\uD800\uDC3F-\uD800\uDC4D",
         "\uD800\uDC50-\uD800\uDC5D",
         "\uD800\uDC80-\uD800\uDCFA",
         "\uD800\uDF00-\uD800\uDF1E",
         "\uD800\uDF30-\uD800\uDF40",
         "\uD800\uDF42-\uD800\uDF49",
         "\uD800\uDF80-\uD800\uDF9D",
         "\uD800\uDFA0-\uD800\uDFC3",
         "\uD800\uDFC8-\uD800\uDFCF",
         "\uD801\uDC00-\uD801\uDC9D",
         "\uD801\uDCA0-\uD801\uDCA9",
         "\uD802\uDC00-\uD802\uDC05",
         "\uD802\uDC0A-\uD802\uDC35",
         "\uD802\uDC37-\uD802\uDC38",
         "\uD802\uDD00-\uD802\uDD15",
         "\uD802\uDE10-\uD802\uDE13",
         "\uD802\uDE15-\uD802\uDE17",
         "\uD802\uDE19-\uD802\uDE33",
         "\uD808\uDC00-\uD808\uDF6E",
         "\uD835\uDC00-\uD835\uDC54",
         "\uD835\uDC56-\uD835\uDC9C",
         "\uD835\uDC9E-\uD835\uDC9F",
         "\uD835\uDCA5-\uD835\uDCA6",
         "\uD835\uDCA9-\uD835\uDCAC",
         "\uD835\uDCAE-\uD835\uDCB9",
         "\uD835\uDCBD-\uD835\uDCC3",
         "\uD835\uDCC5-\uD835\uDD05",
         "\uD835\uDD07-\uD835\uDD0A",
         "\uD835\uDD0D-\uD835\uDD14",
         "\uD835\uDD16-\uD835\uDD1C",
         "\uD835\uDD1E-\uD835\uDD39",
         "\uD835\uDD3B-\uD835\uDD3E",
         "\uD835\uDD40-\uD835\uDD44",
         "\uD835\uDD4A-\uD835\uDD50",
         "\uD835\uDD52-\uD835\uDEA5",
         "\uD835\uDEA8-\uD835\uDEC0",
         "\uD835\uDEC2-\uD835\uDEDA",
         "\uD835\uDEDC-\uD835\uDEFA",
         "\uD835\uDEFC-\uD835\uDF14",
         "\uD835\uDF16-\uD835\uDF34",
         "\uD835\uDF36-\uD835\uDF4E",
         "\uD835\uDF50-\uD835\uDF6E",
         "\uD835\uDF70-\uD835\uDF88",
         "\uD835\uDF8A-\uD835\uDFA8",
         "\uD835\uDFAA-\uD835\uDFC2",
         "\uD835\uDFC4-\uD835\uDFCB",
         "\uD835\uDFCE-\uD835\uDFFF",
         "\uD840\uDC00-\uD840\uDFFF",
         "\uD841\uDC00-\uD841\uDFFF",
         "\uD842\uDC00-\uD842\uDFFF",
         "\uD843\uDC00-\uD843\uDFFF",
         "\uD844\uDC00-\uD844\uDFFF",
         "\uD845\uDC00-\uD845\uDFFF",
         "\uD846\uDC00-\uD846\uDFFF",
         "\uD847\uDC00-\uD847\uDFFF",
         "\uD848\uDC00-\uD848\uDFFF",
         "\uD849\uDC00-\uD849\uDFFF",
         "\uD84A\uDC00-\uD84A\uDFFF",
         "\uD84B\uDC00-\uD84B\uDFFF",
         "\uD84C\uDC00-\uD84C\uDFFF",
         "\uD84D\uDC00-\uD84D\uDFFF",
         "\uD84E\uDC00-\uD84E\uDFFF",
         "\uD84F\uDC00-\uD84F\uDFFF",
         "\uD850\uDC00-\uD850\uDFFF",
         "\uD851\uDC00-\uD851\uDFFF",
         "\uD852\uDC00-\uD852\uDFFF",
         "\uD853\uDC00-\uD853\uDFFF",
         "\uD854\uDC00-\uD854\uDFFF",
         "\uD855\uDC00-\uD855\uDFFF",
         "\uD856\uDC00-\uD856\uDFFF",
         "\uD857\uDC00-\uD857\uDFFF",
         "\uD858\uDC00-\uD858\uDFFF",
         "\uD859\uDC00-\uD859\uDFFF",
         "\uD85A\uDC00-\uD85A\uDFFF",
         "\uD85B\uDC00-\uD85B\uDFFF",
         "\uD85C\uDC00-\uD85C\uDFFF",
         "\uD85D\uDC00-\uD85D\uDFFF",
         "\uD85E\uDC00-\uD85E\uDFFF",
         "\uD85F\uDC00-\uD85F\uDFFF",
         "\uD860\uDC00-\uD860\uDFFF",
         "\uD861\uDC00-\uD861\uDFFF",
         "\uD862\uDC00-\uD862\uDFFF",
         "\uD863\uDC00-\uD863\uDFFF",
         "\uD864\uDC00-\uD864\uDFFF",
         "\uD865\uDC00-\uD865\uDFFF",
         "\uD866\uDC00-\uD866\uDFFF",
         "\uD867\uDC00-\uD867\uDFFF",
         "\uD868\uDC00-\uD868\uDFFF",
         "\uD869\uDC00-\uD869\uDED6"
      };
}